'use strict';

const os = require('os');

module.exports = {
	rules: {
		/**
		 * enforce spaces inside of brackets
		 * @see http://eslint.org/docs/rules/array-bracket-spacing
		 * @since 3.0.0
		 */
		'array-bracket-spacing': [
			'error',
			'always',
			{
				objectsInArrays: false,
				arraysInArrays: false,
			},
		],

		/**
		 * enforce spaces inside of single line blocks
		 * @see http://eslint.org/docs/rules/block-spacing
		 */
		'block-spacing': ['error', 'always'],

		/**
		 * @see http://eslint.org/docs/rules/brace-style
		 * @since 3.0.0
		 * @example
		 *
		 * ```js
		 * // correct
		 * if (foo) {
		 *   bar();
		 * }
		 *
		 * foo: { type: Array, default() { return []; } }
		 *
		 * if (foo) bar();
		 *
		 * if (foo) { bar(); }
		 *
		 * // incorrect
		 *
		 * if (foo) {
		 *   bar();
		 * }
		 * else {
		 *   baz();
		 * }
		 * ```
		 */
		'brace-style': ['error', '1tbs', { allowSingleLine: true }],

		/**
		 * not require camel case names
		 * @see http://eslint.org/docs/rules/camelcase
		 */
		camelcase: 'off',

		/**
		 * enforce spacing before and after comma
		 * @see http://eslint.org/docs/rules/comma-spacing
		 */
		'comma-spacing': ['error', { before: false, after: true }],

		/**
		 * enforce one true comma style
		 * @see http://eslint.org/docs/rules/comma-style
		 * @since 3.0.0
		 * @example
		 *
		 * ```js
		 * // incorrect
		 * var foo = 1
		 * ,
		 * bar = 2;
		 *
		 * var foo = 1
		 * , bar = 2;
		 *
		 * var foo = ["apples"
		 * , "oranges"];
		 *
		 * function bar() {
		 *   return {
		 *     "a": 1
		 *     ,"b:": 'error
		 *   };
		 * }
		 * ```
		 */
		'comma-style': ['error', 'last'],

		/**
		 * allow padding inside computed properties
		 * @see http://eslint.org/docs/rules/computed-property-spacing
		 */
		'computed-property-spacing': 'off',

		/**
		 * not enforces consistent naming when capturing the current execution context
		 * @see http://eslint.org/docs/rules/consistent-this
		 */
		'consistent-this': 'off',

		/**
		 * enforce newline at the end of file, with no multiple empty lines
		 * @see http://eslint.org/docs/rules/eol-last
		 */
		'eol-last': 'error',

		/**
		 * not require function expressions to have a name
		 * @see http://eslint.org/docs/rules/func-names
		 */
		'func-names': 'off',

		/**
		 * not enforces use of function declarations or expressions
		 * @see http://eslint.org/docs/rules/func-style
		 */
		'func-style': 'off',

		/**
		 * Blacklist certain identifiers to prevent them being used
		 * @see http://eslint.org/docs/rules/id-blacklist
		 */
		'id-blacklist': 'off',

		/**
		 * not enforces minimum and maximum identifier lengths
		 * (variable names, property names etc.)
		 * @see http://eslint.org/docs/rules/id-length
		 */
		'id-length': 'off',

		/**
		 * not require identifiers to match the provided regular expression
		 * @see http://eslint.org/docs/rules/id-match
		 */
		'id-match': 'off',

		/**
		 * this option sets a specific tab width for your code
		 * @see http://eslint.org/docs/rules/indent
		 */
		indent: ['error', 4, { SwitchCase: 1, VariableDeclarator: 1 }],

		/**
		 * enforces spacing between keys and values in object literal properties
		 * @see http://eslint.org/docs/rules/key-spacing
		 */
		'key-spacing': ['error', { beforeColon: false, afterColon: true }],

		/**
		 * require a space before & after certain keywords
		 * @see http://eslint.org/docs/rules/keyword-spacing
		 */
		'keyword-spacing': [
			'error',
			{
				before: true,
				after: true,
				overrides: {
					return: { after: true },
					throw: { after: true },
					case: { after: true },
				},
			},
		],

		/**
		 * enforces the usage of Unix line endings: \n for LF
		 * @see http://eslint.org/docs/rules/linebreak-style
		 */
		'linebreak-style': [os.platform() === 'win32' ? 'off' : 'error', 'unix'],

		/**
		 * not enforces empty lines around comments
		 * @see http://eslint.org/docs/rules/lines-around-comment
		 */
		'lines-around-comment': 'off',

		/**
		 * specify the maximum depth that blocks can be nested
		 * @see http://eslint.org/docs/rules/max-depth
		 */
		'max-depth': 'off',

		/**
		 * not specify the maximum length of a line in your program
		 * @see http://eslint.org/docs/rules/max-len
		 * @since 3.0.0
		 */
		'max-len': 'off',

		/**
		 * not specify the maximum depth callbacks can be nested
		 * @see http://eslint.org/docs/rules/max-nested-callbacks
		 */
		'max-nested-callbacks': 'off',

		/**
		 * limits the number of parameters that can be used in the function declaration.
		 * @see http://eslint.org/docs/rules/max-params
		 */
		'max-params': 'off',

		/**
		 * specify the maximum number of statement allowed in a function
		 * @see http://eslint.org/docs/rules/max-statements
		 */
		'max-statements': 'off',

		/**
		 * restrict the number of statements per line
		 * @see http://eslint.org/docs/rules/max-statements-per-line
		 * @since 3.0.0
		 */
		'max-statements-per-line': 'off',

		/**
		 * not require a capital letter for constructors
		 * @see http://eslint.org/docs/rules/new-cap
		 */
		'new-cap': 'off',

		/**
		 * disallow the omission of parentheses when invoking a constructor with no arguments
		 * @see http://eslint.org/docs/rules/new-parens
		 */
		'new-parens': 'error',

		/**
		 * allow an empty newline after var statement
		 * @see http://eslint.org/docs/rules/newline-after-var
		 */
		'newline-after-var': 'off',

		/**
		 * @see http://eslint.org/docs/rules/newline-before-return
		 */
		'newline-before-return': 'off',

		/**
		 * enforces new line after each method call in the chain to make it
		 * more readable and easy to maintain
		 */
		'newline-per-chained-call': ['error', { ignoreChainWithDepth: 3 }],

		/**
		 * disallow use of the Array constructor
		 * @see http://eslint.org/docs/rules/no-array-constructor
		 */
		'no-array-constructor': 'error',

		/**
		 * disallow use of bitwise operators
		 * @see http://eslint.org/docs/rules/no-bitwise
		 */
		'no-bitwise': 'error',

		/**
		 * allow use of the continue statement
		 * @see http://eslint.org/docs/rules/no-continue
		 */
		'no-continue': 'off',

		/**
		 * allow comments inline after code
		 * @see http://eslint.org/docs/rules/no-inline-comments
		 */
		'no-inline-comments': 'off',

		/**
		 * allow if as the only statement in an else block
		 * @see http://eslint.org/docs/rules/no-lonely-if
		 */
		'no-lonely-if': 'off',

		/**
		 * disallow mixed spaces and tabs for indentation
		 * @see http://eslint.org/docs/rules/no-mixed-spaces-and-tabs
		 */
		'no-mixed-spaces-and-tabs': ['error', false],

		/**
		 * disallow multiple empty lines and only one newline at the end
		 * @see http://eslint.org/docs/rules/no-multiple-empty-lines
		 * @since 3.0.0
		 */
		'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 1 }],

		/**
		 * allow negated conditions
		 * @see http://eslint.org/docs/rules/no-negated-condition
		 */
		'no-negated-condition': 'off',

		/**
		 * disallow negating the left operand in `in` expressions
		 * @see http://eslint.org/docs/rules/no-negated-in-lhs
		 */
		'no-negated-in-lhs': 'error',

		/**
		 * allow nested ternary expressions
		 * @see http://eslint.org/docs/rules/no-nested-ternary
		 */
		'no-nested-ternary': 'off',

		/**
		 * disallow use of the Object constructor
		 * @see http://eslint.org/docs/rules/no-new-object
		 */
		'no-new-object': 'error',

		/**
		 * allow use of unary operators, ++ and --
		 * @see http://eslint.org/docs/rules/no-plusplus
		 */
		'no-plusplus': 'off',

		/**
		 * disallow certain syntax forms
		 * @see http://eslint.org/docs/rules/no-restricted-syntax
		 */
		'no-restricted-syntax': [2, 'WithStatement'],

		/**
		 * disallow space between function identifier and application
		 * @see http://eslint.org/docs/rules/no-spaced-func
		 */
		'no-spaced-func': 'error',

		/**
		 * allow the use of ternary operators
		 * @see http://eslint.org/docs/rules/no-ternary
		 */
		'no-ternary': 'off',

		/**
		 * disallow trailing whitespace at the end of lines
		 * @see http://eslint.org/docs/rules/no-trailing-spaces
		 */
		'no-trailing-spaces': 'error',

		/**
		 * allow dangling underscores in identifiers
		 * @see http://eslint.org/docs/rules/no-underscore-dangle
		 */
		'no-underscore-dangle': 'off',

		/**
		 * allow the use of Boolean literals in conditional expressions
		 * also, prefer `a || b` over `a ? a : b`
		 * @see http://eslint.org/docs/rules/no-unneeded-ternary
		 */
		'no-unneeded-ternary': 'error',

		/**
		 * disallow whitespace before properties
		 * @see http://eslint.org/docs/rules/no-whitespace-before-property
		 */
		'no-whitespace-before-property': 'error',

		/**
		 * require padding inside curly braces
		 * @see http://eslint.org/docs/rules/object-curly-spacing
		 * @since 3.0.0
		 * @example
		 *
		 * ```js
		 * // incorrect
		 * var obj = {'foo': 'bar'};
		 * var obj = {'foo': 'bar' };
		 * var obj = { baz: {'foo': 'qux'}, bar};
		 * var obj = {baz: { 'foo': 'qux' }, bar};
		 * var obj = {'foo': 'bar'
		 * };
		 * ```
		 */
		'object-curly-spacing': ['error', 'always'],

		/**
		 * not enforce "same line" or "multiple line" on object properties.
		 * @see http://eslint.org/docs/rules/object-property-newline
		 */
		'object-property-newline': 'off',

		/**
		 * allow just one var statement per function
		 * @see http://eslint.org/docs/rules/one-var
		 */
		'one-var': 'off',

		/**
		 * require a newline around variable declaration
		 * @see http://eslint.org/docs/rules/one-var-declaration-per-line
		 * @since 3.0.0
		 */
		'one-var-declaration-per-line': ['error', 'always'],

		/**
		 * not require assignment operator shorthand where possible or prohibit it entirely
		 * @see http://eslint.org/docs/rules/operator-assignment
		 */
		'operator-assignment': 'off',

		/**
		 * not enforce operators to be placed before or after line breaks
		 * @see http://eslint.org/docs/rules/operator-linebreak
		 */
		'operator-linebreak': 'off',

		/**
		 * allow padding within blocks
		 * @see http://eslint.org/docs/rules/padded-blocks
		 */
		'padded-blocks': 'off',

		/**
		 * not require quotes around object literal property names
		 * @see http://eslint.org/docs/rules/quote-props
		 */
		'quote-props': ['error', 'as-needed', { keywords: false }],

		/**
		 * specify whether double or single quotes should be used
		 * @see http://eslint.org/docs/rules/quotes
		 */
		quotes: ['error', 'single', { avoidEscape: true }],

		/**
		 * do not require jsdoc
		 * @see http://eslint.org/docs/rules/require-jsdoc
		 */
		'require-jsdoc': 'off',

		/**
		 * disallow use of semicolons instead of ASI
		 * @see http://eslint.org/docs/rules/semi
		 */
		semi: ['error', 'always'],

		/**
		 * enforce spacing before and after semicolons
		 * @see http://eslint.org/docs/rules/semi-spacing
		 */
		'semi-spacing': ['error', { before: false, after: true }],

		/**
		 * not sort variables within the same declaration block
		 * @see http://eslint.org/docs/rules/sort-vars
		 */
		'sort-vars': 'off',

		/**
		 * disallow space before blocks
		 * @see http://eslint.org/docs/rules/space-before-blocks
		 */
		'space-before-blocks': 'error',

		/**
		 * require or disallow space before function opening parenthesis
		 * @see http://eslint.org/docs/rules/space-before-function-paren
		 */
		'space-before-function-paren': [
			'error',
			{
				anonymous: 'never',
				named: 'never',
			},
		],

		/**
		 * require or disallow spaces inside parentheses
		 * @see http://eslint.org/docs/rules/space-in-parens
		 */
		'space-in-parens': ['error', 'never'],

		/**
		 * require spaces around operators
		 * @see http://eslint.org/docs/rules/space-infix-ops
		 */
		'space-infix-ops': 'error',

		/**
		 * Require spaces before/after unary operators
		 * @see http://eslint.org/docs/rules/space-unary-ops
		 */
		'space-unary-ops': [
			'error',
			{
				words: true,
				nonwords: false,
			},
		],

		/**
		 * require or disallow a space immediately following the // or /* in a comment
		 * @see http://eslint.org/docs/rules/spaced-comment
		 */
		'spaced-comment': [
			'error',
			'always',
			{
				exceptions: ['-', '+'],
				markers: ['*!'],
			},
		],

		/**
		 * not require regex literals to be wrapped in parentheses
		 * @see http://eslint.org/docs/rules/wrap-regex
		 */
		'wrap-regex': 'off',

		/**
		 * unnecessary escape usage
		 * @see http://eslint.org/docs/rules/no-useless-escape
		 */
		'no-useless-escape': 'off',
	},
};
